package com.hdax.search.thread;


import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 两个任务有一个任务完成，就可以执行以下线程
 */
public class Text03 {

    /**
     * 1、runAfterEitherAsync:无法拿到以上两个线程的返回值，自身也没有返回值
     * 2、acceptEitherAsync:可以感知(两个线程其中一个的返回结果，谁先执行完，就获取谁的返回结果)结果，自己不返回结果
     * 3、 applyToEitherAsync：可以感知到线程的返回结果，自身也可以返回结果
     */

    public static ExecutorService executorService= Executors.newFixedThreadPool(10);
    public static void main(String[] args) {
        CompletableFuture<Integer> one = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务一");
            return 1;
        }, executorService);

        CompletableFuture<Integer> two = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务一");
            return 1;
        }, executorService);

        /**
         * one,two 两个线程只有有一个线程完成就可以执行线程三
         */
        /**
         * runAfterEitherAsync:不感知以上线程的返回结果，自身也没有返回值
         */
        one.runAfterEitherAsync(two,()->{
            System.out.println("任务三开始");
        },executorService);

        /**
         * acceptEitherAsync:自己可以感知结果，自己不返回结果
         */

        one.acceptEitherAsync(two,(res)->{
            System.out.println("线程三");
            System.out.println("以上两个线程其中一个的返回结果"+res);
        },executorService);


        /**
         * applyToEitherAsync：可以感知到线程的返回结果，自身也可以返回结果
         */
        one.applyToEitherAsync(two,(result)->{
            System.out.println("线程三执行了");
            System.out.println("以上两个线程其中一个线程的返回结果"+result);
            return 1;
        },executorService);
    }
}
